package com.chen.shopping_seckill_service.redis;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class RedissonLock {
    @Autowired
    private RedissonClient redissonClient;

    /**
     * 加锁
     * @param key  商品goodId
     * @param expireTime  过期时间
     * @return
     */
    public boolean lock(String key,long expireTime){
        //拿到锁的名字；redis的key，即锁的名为秒杀商品id；
        RLock lock = redissonClient.getLock("lock:" + key);
        try {
            /**
             * 尝试获取这把锁，并且设置该锁的过期时间；
             * 如果服务没有主动释放锁，那么该锁会自动过期，防止死锁
             * 获取成功返回锁
             */
            return lock.tryLock(expireTime, TimeUnit.MICROSECONDS);
        } catch (InterruptedException e) {
            /**
             * 如果拿不到这把锁，就说明被别的线程占用了
             * 此时要中断当前线程
             */
            Thread.currentThread().interrupt();
            return false;
        }
    }

    /**
     * 释放锁
     * @param key
     */
    public void unlock(String key){
        RLock lock = redissonClient.getLock("lock:" + key);
        if (lock.isLocked()){
            lock.unlock();
        }
    }
}
